{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 1.parser.add_argument()命令行参数解析包，可以频繁的修改参数\n",
    "#### 2.assert断言\n",
    "#### 3.autocast自动混合精度\n",
    "#### [4.split()](#4)\n",
    "#### 5.Counter（）统计词频\n",
    "#### 6.if语句群魔乱舞\n",
    "#### 7.random.seed()随机种子的作用\n",
    "#### [8.字典的key方法](#8)\n",
    "#### 9.y_pred = (y_pred > 0.5).long().data.numpy().astype(np.int32)\n",
    "#### 10.手动求解梯度和计算机求解梯度的区别\n",
    "#### 11.torch.linspace(start, end, steps)按照等步长切分\n",
    "#### [12.维度的理解，对维度进行操作](#12)\n",
    "#### 13.torch.normal(mean, std, out=None)返回一个张量，张量的每个值符合正态分布\n",
    "#### 14.torch.eq(input, other)比较元素是否相等\n",
    "#### 14.1.torch.equal(tensor1, tensor2, out=None)比较两个张量是否相等，包含元素和形状\n",
    "#### 15.torch.mean(input, dim, keepdim=False)当keepdim=True时输入维度等于输出维度"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 189,
   "metadata": {},
   "outputs": [],
   "source": [
    "from torch.cuda.amp import autocast,GradScaler\n",
    "import torch\n",
    "from torch.autograd import Variable\n",
    "import numpy as np\n",
    "from collections import Counter# 统计词频\n",
    "import random\n",
    "from matplotlib import pyplot as plt\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 1.parser.add_argument()命令行参数解析包，可以频繁的修改参数\n",
    "* name or flags  - 必选参数名或者可选参数标识符，它必须作为add_argument()方法的第一个参数。\n",
    "* dest- 这个参数相当于把位置参数或者选项参数关联到一个特定的名字\n",
    "* action- 表示值赋予键的方式，这里用到的是bool类型，action意思是当读取的参数中出现指定参数的时候的行为,调用时只需要传入name即可\n",
    "* help       - 参数的说明信息\n",
    "* required    - 说明参数是否必须进行输入，只支持可选参数。\n",
    "* type      - 指定命令行参数数据类型\n",
    "* choices    - 说明命令行参数的取值范围，它的值一般是一个列表。choices列表中元素的类型应该与type批定的类型相兼容\n",
    "* default   - 必选参数和可选的参数的默认值。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 85,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Namespace(dataset_tag='ace2005', lr=2e-05, max_len=512, not_save=False, train_batch=10)\n",
      "====================万能的分隔符====================\n",
      "args.dataset_tag:  ace2005\n",
      "args.train_batch:  10\n"
     ]
    }
   ],
   "source": [
    "import argparse\n",
    "\n",
    "# 创建一个解析器 \n",
    "parser = argparse.ArgumentParser(description=\"argparse库的应用\")\n",
    "# 添加参数\n",
    "parser.add_argument(\"--dataset_tag\", default='ace2005', choices=['ace2005', 'ace2004'])\n",
    "parser.add_argument(\"--train_batch\", type=int, default=10)\n",
    "parser.add_argument(\"--max_len\", default=512, type=int, help=\"maximum length of input\")\n",
    "parser.add_argument(\"--lr\", type=float, default=2e-5)\n",
    "parser.add_argument(\"--not_save\", action=\"store_true\", help=\"whether to save the model\")\n",
    "\n",
    "# 拿到args，从命令行中传值即可。\n",
    "args = parser.parse_args(args=[])# 加入args=[]才能运行，jupyter的特点\n",
    "'''\n",
    "保存运行的结果\n",
    "python model.py --dataset_tag ace2004 --train_batch 30 --max_len 320 --not_save\n",
    "不保存结果\n",
    "python model.py --dataset_tag ace2004 --train_batch 30 --max_len 320 \n",
    "'''\n",
    "\n",
    "print(args)\n",
    "# 执行函数的返回值为argumentParser的格式，获取值应用parse_args函数\n",
    "print(20*\"=\" + \"万能的分隔符\"+ 20*\"=\")\n",
    "print(\"args.dataset_tag: \",args.dataset_tag)\n",
    "print(\"args.train_batch: \",args.train_batch)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 2.assert断言\n",
    "在测试用例中，执行完测试用例后，最后一步是判断测试结果是pass还是fail，自动化测试脚本里面一般把这种生成测试结果的方法称为断言（assert）\n",
    "\n",
    "* 在没完善一个程序之前，我们不知道程序在哪里会出错，与其让它在运行时崩溃，不如在出现错误条件时就崩溃"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "asert 2 > 1断言成立，可以执行下面的分隔符程序\n",
      "====================万能的分隔符====================\n"
     ]
    },
    {
     "ename": "AssertionError",
     "evalue": "",
     "output_type": "error",
     "traceback": [
      "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[1;31mAssertionError\u001b[0m                            Traceback (most recent call last)",
      "\u001b[1;32m<ipython-input-8-5524b1ab30d1>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m\u001b[0m\n\u001b[0;32m      2\u001b[0m \u001b[0mprint\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m\"asert 2 > 1断言成立，可以执行下面的分隔符程序\"\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m      3\u001b[0m \u001b[0mprint\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;36m20\u001b[0m\u001b[1;33m*\u001b[0m\u001b[1;34m\"=\"\u001b[0m \u001b[1;33m+\u001b[0m \u001b[1;34m\"万能的分隔符\"\u001b[0m\u001b[1;33m+\u001b[0m \u001b[1;36m20\u001b[0m\u001b[1;33m*\u001b[0m\u001b[1;34m\"=\"\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 4\u001b[1;33m \u001b[1;32massert\u001b[0m \u001b[1;36m1\u001b[0m \u001b[1;33m>\u001b[0m \u001b[1;36m2\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m      5\u001b[0m \u001b[0mprint\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m\"asert 2 > 1断言不成立，不可以执行下面的分隔符程序\"\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m      6\u001b[0m \u001b[0mprint\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;36m20\u001b[0m\u001b[1;33m*\u001b[0m\u001b[1;34m\"=\"\u001b[0m \u001b[1;33m+\u001b[0m \u001b[1;34m\"万能的分隔符\"\u001b[0m\u001b[1;33m+\u001b[0m \u001b[1;36m20\u001b[0m\u001b[1;33m*\u001b[0m\u001b[1;34m\"=\"\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;31mAssertionError\u001b[0m: "
     ]
    }
   ],
   "source": [
    "assert 2 > 1\n",
    "print(\"asert 2 > 1断言成立，可以执行下面的分隔符程序\")\n",
    "print(20*\"=\" + \"万能的分隔符\"+ 20*\"=\")\n",
    "assert 1 > 2\n",
    "print(\"asert 1 > 2断言不成立，不可以执行下面的分隔符程序\")\n",
    "print(20*\"=\" + \"万能的分隔符\"+ 20*\"=\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 3.autocast自动混合精度\n",
    "### 在PyTorch中，一共有10种类型的tensor：\n",
    "* torch.FloatTensor (32-bit floating point)\n",
    "* torch.DoubleTensor (64-bit floating point)\n",
    "* torch.HalfTensor (16-bit floating point 1)\n",
    "* torch.BFloat16Tensor (16-bit floating point 2)\n",
    "* torch.ByteTensor (8-bit integer (unsigned))\n",
    "* torch.CharTensor (8-bit integer (signed))\n",
    "* torch.ShortTensor (16-bit integer (signed))\n",
    "* torch.IntTensor (32-bit integer (signed))\n",
    "* torch.LongTensor (64-bit integer (signed))\n",
    "* torch.BoolTensor (Boolean)  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "a:\n",
      " tensor([[0.6307, 0.2915, 0.0429],\n",
      "        [0.1981, 0.5090, 0.2749]])\n",
      "a.shape:  torch.Size([2, 3])\n",
      "a.dtype:  torch.float32\n",
      "a_1.dtype:  torch.int64\n",
      "b.dtype:  torch.float64\n",
      "====================万能的分隔符====================\n",
      "tensor([[0.2649, 0.1864, 0.0300],\n",
      "        [0.0299, 0.2298, 0.0436]], dtype=torch.float64)\n",
      "torch.float64\n"
     ]
    }
   ],
   "source": [
    "a = torch.rand(2, 3)# float32\n",
    "a_1 = torch.tensor([1, 2])\n",
    "print(\"a:\\n\", a)\n",
    "print(\"a.shape: \", a.shape)\n",
    "print(\"a.dtype: \", a.dtype)\n",
    "print(\"a_1.dtype: \", a_1.dtype)\n",
    "\n",
    "b = torch.rand(2, 3).double()# float64\n",
    "print(\"b.dtype: \", b.dtype)\n",
    "\n",
    "print(20*\"=\" + \"万能的分隔符\"+ 20*\"=\")\n",
    "\n",
    "with autocast():\n",
    "    result = torch.mul(a, b)# mul对位相乘\n",
    "    print(result)\n",
    "    print(result.dtype)# float 64"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# <span id=4>4.split()</span>\n",
    "## 通过指定分隔符对字符串进行切分\n",
    "* str.split(str=\"\", num=string.count(str))\n",
    "    * str-分隔符，默认为空字符切分，也可以使用换行、空格、制表符\n",
    "    * num-分割的次数，默认为-1，即分割所有\n",
    "        * **拆分1次分为两块，拆分2次分为三块**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 57,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "['Line1-abcdef', 'Line2-abc', 'Line4-abcd']\n",
      "====================万能的分隔符====================\n",
      "['Line1-abcdef ', 'Line2-abc ', 'Line4-abcd']\n",
      "====================万能的分隔符====================\n",
      "['Line1-abcdef', 'Line2-abc', 'Line4-abcd', 'Line1-abcdef', 'Line2-abc', 'Line4-abcd']\n",
      "['Line1-abcdef ', 'Line2-abc ', 'Line4-abcd Line1-abcdef \\nLine2-abc \\nLine4-abcd']\n",
      "['Line1-abcdef ', 'Line2-abc ', 'Line4-abcd Line1-abcdef ', 'Line2-abc \\nLine4-abcd']\n"
     ]
    }
   ],
   "source": [
    "str = \"Line1-abcdef \\nLine2-abc \\nLine4-abcd\";\n",
    "\n",
    "print(str.split())\n",
    "print(20*\"=\" + \"万能的分隔符\"+ 20*\"=\")\n",
    "\n",
    "print(str.split('\\n', 2))\n",
    "\n",
    "'''\n",
    "['Line1-abcdef', 'Line2-abc', 'Line4-abcd']     以空格进行拆分\n",
    "['Line1-abcdef ', 'Line2-abc ', 'Line4-abcd']   以\\n进行拆分，因此拆分两次，中间还有空格.  \n",
    "'''\n",
    "print(20*\"=\" + \"万能的分隔符\"+ 20*\"=\")\n",
    "\n",
    "str = \"Line1-abcdef \\nLine2-abc \\nLine4-abcd Line1-abcdef \\nLine2-abc \\nLine4-abcd\";\n",
    "\n",
    "print(str.split())\n",
    "print(str.split('\\n', 2))\n",
    "print(str.split('\\n', 3))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 5.Counter（）统计词频\n",
    "## 使用实例化的对象dict[key]+=1统计的词频\n",
    "## return：dict\n",
    "***\n",
    "**[字典的get方法](#8)**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 59,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{'red': 2, 'blue': 3, 'green': 1}\n"
     ]
    }
   ],
   "source": [
    "'''传统方式统计词频'''\n",
    "#red:2  , blue:3 , green:1\n",
    "colors = ['red', 'blue', 'red', 'green', 'blue', 'blue']\n",
    "result = {}\n",
    "for color in colors:\n",
    "    if result.get(color) == None:# 字典的get方法，如果没有相应的key, 则把key加入到字典，若有了，则进行其他操作，一般是把对应的value设置成列表，依次加入\n",
    "        result[color] = 1\n",
    "    else:\n",
    "        result[color] += 1\n",
    "print (result)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 64,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Counter({'blue': 3, 'red': 2, 'green': 1})\n",
      "<class 'collections.Counter'>\n",
      "{'red': 2, 'blue': 3, 'green': 1}\n"
     ]
    }
   ],
   "source": [
    "colors = ['red', 'blue', 'red', 'green', 'blue', 'blue']\n",
    "c = Counter(colors)\n",
    "print (c)\n",
    "print(type(c))\n",
    "print(dict(c))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 使用时一般是实例化一个对象进行调用"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 66,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Counter({'blue': 3, 'red': 2, 'green': 1})\n",
      "{'red': 2, 'blue': 3, 'green': 1}\n"
     ]
    }
   ],
   "source": [
    "colors = ['red', 'blue', 'red', 'green', 'blue', 'blue']\n",
    "counter = Counter()\n",
    "for color in colors:\n",
    "    counter[color] += 1\n",
    "print(counter)\n",
    "print(dict(counter))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 6.if语句群魔乱舞"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 79,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "if x is True\n",
      "if x is True === if not x is None\n",
      "if x is True === if x is True === if not (x is None)\n"
     ]
    }
   ],
   "source": [
    "x = True\n",
    "\n",
    "if x is True:\n",
    "    print(\"if x is True\")\n",
    "\n",
    "if not x is None:\n",
    "    print(\"if x is True === if not x is None\")\n",
    "\n",
    "if not (x is None):\n",
    "    print('if x is True === if x is True === if not (x is None)')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 7.random随机种子的作用"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 91,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.2550690257394217\n",
      "0.49543508709194095\n",
      "0.4494910647887381\n",
      "====================万能的分隔符====================\n",
      "0.651592972722763\n",
      "0.7887233511355132\n",
      "0.0938595867742349\n",
      "====================万能的分隔符====================\n",
      "0.13436424411240122\n",
      "0.8474337369372327\n",
      "0.763774618976614\n",
      "====================万能的分隔符====================\n",
      "0.13436424411240122\n",
      "0.8474337369372327\n",
      "0.763774618976614\n",
      "====================万能的分隔符====================\n"
     ]
    }
   ],
   "source": [
    "for _ in range(3):\n",
    "    a = random.random()\n",
    "    print(a)\n",
    "print(20*\"=\" + \"万能的分隔符\"+ 20*\"=\")\n",
    "\n",
    "for _ in range(3):\n",
    "    a = random.random()\n",
    "    print(a)\n",
    "print(20*\"=\" + \"万能的分隔符\"+ 20*\"=\")\n",
    "\n",
    "# 指定随机种子,可以让每一次生成的随机数固定\n",
    "random.seed(1)\n",
    "for _ in range(3):\n",
    "    a = random.random()\n",
    "    print(a)\n",
    "print(20*\"=\" + \"万能的分隔符\"+ 20*\"=\")\n",
    "\n",
    "random.seed(1)\n",
    "for _ in range(3):\n",
    "    a = random.random()\n",
    "    print(a)\n",
    "print(20*\"=\" + \"万能的分隔符\"+ 20*\"=\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# <span id=8>8.字典的get方法</span>\n",
    "\n",
    "### dict.get(key, default=None)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 97,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Value : 27\n",
      "Value : None\n",
      "Value : Not Available\n",
      "{'Name': 'Runoob', 'Age': 27}\n"
     ]
    }
   ],
   "source": [
    "dict = {'Name': 'Runoob', 'Age': 27}\n",
    "'''key在字典中，返回对应的value，不在字典中，默认返回None，否则返回指定的值'''\n",
    "print(\"Value : %s\" %  dict.get('Age'))# key在字典中，返回对应的value\n",
    "print(\"Value : %s\" %  dict.get('Sex')) # 不在字典中，默认返回None\n",
    "print(\"Value : %s\" %  dict.get('Sex', \"Not Available\")) # 返回指定的值 \"Not Available\"\n",
    "print(dict)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 把一个字典的value(数字列表)转化为一个tensor格式"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 106,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{'batch_1_context': [tensor([1, 2, 3, 4, 5])], 'batch_1_answer': [tensor([61, 62, 63, 64, 65])]}\n",
      "====================万能的分隔符====================\n",
      "k:  batch_1_context\n",
      "v:  [tensor([1, 2, 3, 4, 5])]\n",
      "type(v): <class 'list'>\n",
      "v[0]:  tensor([1, 2, 3, 4, 5])\n",
      "type(v[0]): <class 'torch.Tensor'>\n",
      "====================万能的分隔符====================\n",
      "k:  batch_1_answer\n",
      "v:  [tensor([61, 62, 63, 64, 65])]\n",
      "type(v): <class 'list'>\n",
      "v[0]:  tensor([61, 62, 63, 64, 65])\n",
      "type(v[0]): <class 'torch.Tensor'>\n",
      "====================万能的分隔符====================\n"
     ]
    }
   ],
   "source": [
    "def collate_fn(batch):\n",
    "    nbatch={}\n",
    "    for b in batch:\n",
    "        for k, v in b.items():\n",
    "            nbatch[k] = nbatch.get(k, []) + [torch.tensor(v)] \n",
    "    return nbatch\n",
    "\n",
    "batch = [\n",
    "    [\n",
    "        {\"batch_1_context\":[1, 2, 3, 4, 5]},\n",
    "        {\"batch_1_answer\":[61, 62, 63, 64, 65]}\n",
    "    ],\n",
    "    [\n",
    "        {\"batch_2_context\":[11, 12, 13, 14, 15]},\n",
    "        {\"batch_2_answer\":[81, 82, 83, 84, 85]}\n",
    "    ]\n",
    "]\n",
    "result = collate_fn(batch[0])\n",
    "print(result)\n",
    "print(20*\"=\" + \"万能的分隔符\"+ 20*\"=\")\n",
    "\n",
    "for k, v in result.items():\n",
    "    print(\"k: \", k)\n",
    "    print(\"v: \", v)\n",
    "    print(\"type(v):\", type(v))\n",
    "    print(\"v[0]: \", v[0])\n",
    "    print(\"type(v[0]):\", type(v[0]))\n",
    "    print(20*\"=\" + \"万能的分隔符\"+ 20*\"=\")\n",
    "    "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 9.y_pred = (y_pred > 0.5).long().data.numpy().astype(np.int32)\n",
    "\n",
    "#### tensor.detach()和tensor.data\n",
    "  * 两个都是生成无梯度的纯tensor，共享一片内存地址，即两者是等价的.**推荐使用detach()**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 122,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "tensor([[False, False, False,  True],\n",
      "        [ True, False, False, False],\n",
      "        [ True,  True, False, False],\n",
      "        [ True,  True,  True, False]])\n",
      "<class 'torch.Tensor'>\n",
      "torch.bool\n",
      "====================万能的分隔符====================\n",
      "(y_pred > 0.5).long(): tensor([[0, 0, 0, 1],\n",
      "        [1, 0, 0, 0],\n",
      "        [1, 1, 0, 0],\n",
      "        [1, 1, 1, 0]])\n",
      "<class 'torch.Tensor'>\n",
      "torch.int64\n",
      "(y_pred > 0.5).long().data tensor([[0, 0, 0, 1],\n",
      "        [1, 0, 0, 0],\n",
      "        [1, 1, 0, 0],\n",
      "        [1, 1, 1, 0]])\n",
      "<class 'torch.Tensor'>\n",
      "torch.int64\n",
      "====================万能的分隔符====================\n",
      "[[0 0 0 1]\n",
      " [1 0 0 0]\n",
      " [1 1 0 0]\n",
      " [1 1 1 0]]\n",
      "<class 'numpy.ndarray'>\n",
      "int64\n",
      "[[0 0 0 1]\n",
      " [1 0 0 0]\n",
      " [1 1 0 0]\n",
      " [1 1 1 0]]\n",
      "<class 'numpy.ndarray'>\n",
      "int32\n"
     ]
    }
   ],
   "source": [
    "y_pred = torch.randn(4, 4)\n",
    "y_result = (y_pred > 0.5)\n",
    "print(y_result)\n",
    "print(type(y_result))\n",
    "print(y_result.dtype)\n",
    "print(20*\"=\" + \"万能的分隔符\"+ 20*\"=\")\n",
    "\n",
    "y_result = y_result.long()\n",
    "print(\"(y_pred > 0.5).long():\",y_result)\n",
    "print(type(y_result))\n",
    "print(y_result.dtype)\n",
    "      \n",
    "y_result = y_result.data\n",
    "print(\"(y_pred > 0.5).long().data\",y_result)\n",
    "print(type(y_result))\n",
    "print(y_result.dtype)\n",
    "print(20*\"=\" + \"万能的分隔符\"+ 20*\"=\")\n",
    "\n",
    "y_result = y_result.numpy()\n",
    "print(y_result)\n",
    "print(type(y_result))\n",
    "print(y_result.dtype)\n",
    "y_result = y_result.astype(np.int32)\n",
    "print(y_result)\n",
    "print(type(y_result))\n",
    "print(y_result.dtype)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# <span id=10>10.grad</span>\n",
    "* 梯度的长度代表函数增长或减少的趋势  \n",
    "* 梯度的方向代表函数的增长或减少的方向\n",
    "$$\n",
    "y = x^2 + 2x\n",
    "$$\n",
    "* **对矩阵求梯度在程序中的表现：**   \n",
    "    * 对矩阵每个位置按照给定的公式进行运算，然后把结果相加，再执行$backward()$得出的结果就是手动求导的结果"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 150,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "x:  tensor([2., 3., 4.], requires_grad=True)\n",
      "y: tensor([ 8., 15., 24.], grad_fn=<AddBackward0>)\n",
      "tensor(47., grad_fn=<SumBackward0>)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "tensor([ 6.,  8., 10.])"
      ]
     },
     "execution_count": 150,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "x = torch.arange(2,5, requires_grad=True,dtype=torch.float)\n",
    "print(\"x: \",x)\n",
    "y = x**2 + x*2\n",
    "print(\"y:\", y)\n",
    "z = y.sum() # dz/dy dy/dx\n",
    "print(z)\n",
    "z.backward() # 从z开始反向传播\n",
    "# y.backward()\n",
    "x.grad"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 152,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "x:  tensor([[2., 3., 4.],\n",
      "        [2., 3., 4.]], requires_grad=True)\n",
      "y: tensor([[13., 20., 29.],\n",
      "        [13., 20., 29.]], grad_fn=<AddBackward0>)\n",
      "tensor(124., grad_fn=<SumBackward0>)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "tensor([[ 6.,  8., 10.],\n",
       "        [ 6.,  8., 10.]])"
      ]
     },
     "execution_count": 152,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "x = torch.tensor([\n",
    "    [2, 3, 4],\n",
    "    [2, 3, 4]\n",
    "], requires_grad=True,dtype=torch.float)\n",
    "print(\"x: \",x)\n",
    "y = x**2 + x*2 + 5\n",
    "print(\"y:\", y)\n",
    "z = y.sum() # dz/dy dy/dx\n",
    "print(z)\n",
    "z.backward() # 从z开始反向传播\n",
    "# y.backward()\n",
    "x.grad"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 11.linspace\n",
    "### 按照等步长切分"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 153,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "tensor([ 3.0000,  4.7500,  6.5000,  8.2500, 10.0000])"
      ]
     },
     "execution_count": 153,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "torch.linspace(3,10,steps=5)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 154,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "tensor([-10.,  -5.,   0.,   5.,  10.])"
      ]
     },
     "execution_count": 154,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "torch.linspace(-10,10,steps=5)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 161,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "tensor([-10.,  -5.,   0.,   5.,  10.])"
      ]
     },
     "execution_count": 161,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "torch.linspace(start=-10, end=10, steps=5)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# <span id=12>12.torch的维度</span>\n",
    "* 维度的理解 **压缩馍的状态，一层又一层**\n",
    "    * 以二维为例 \n",
    "        * dim=0表示每一行， 因此不论怎么操作都会压缩到一行上\n",
    "        * dim=1表示每一列， 因此不论怎么操作，最后的结果都会压缩到一列上"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 164,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "torch.Size([2, 3])\n",
      "tensor([2, 4, 6])\n",
      "tensor([6, 6])\n"
     ]
    }
   ],
   "source": [
    "x = torch.tensor([\n",
    "     [1,2,3],\n",
    "     [1,2,3]\n",
    "])\n",
    "# 我们可以看到\"行\"是dim=0, \"列\"是dim=1\n",
    "print(x.shape)\n",
    "# dim=0表示是行，所以相加后，压缩为一行\n",
    "print(torch.sum(x,dim=0))\n",
    "print(torch.sum(x,dim=1))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 167,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "torch.Size([2, 2, 3])\n",
      "tensor([[2, 3, 4],\n",
      "        [3, 4, 5]])\n",
      "tensor([[2, 4, 6],\n",
      "        [3, 3, 3]])\n",
      "tensor([[6, 6],\n",
      "        [3, 6]])\n"
     ]
    }
   ],
   "source": [
    "x = torch.tensor([\n",
    "     [\n",
    "         [1,2,3],\n",
    "         [1,2,3]\n",
    "     ],\n",
    "     [\n",
    "         [1,1,1],\n",
    "         [2,2,2]\n",
    "     ],\n",
    "])\n",
    "# 我们可以看到\"行\"是dim=0, \"列\"是dim=1\n",
    "print(x.shape)\n",
    "\n",
    "# dim=0表示是行，所以相加后，压缩为一行\n",
    "print(torch.sum(x,dim=0))\n",
    "print(torch.sum(x,dim=1))\n",
    "print(torch.sum(x,dim=2))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 12.1维度的扩展\n",
    "### torch.unsqueeze(input, dim)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 174,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "tensor([[ 0.0766, -1.2062,  0.1266,  1.8357],\n",
      "        [ 2.4626, -0.2721, -0.9617, -0.4804]])\n",
      "torch.Size([2, 4])\n"
     ]
    }
   ],
   "source": [
    "a = torch.randn(2,4)\n",
    "print(a)\n",
    "print(a.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 178,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "torch.Size([1, 2, 4])\n",
      "torch.Size([1, 2, 4, 1])\n"
     ]
    }
   ],
   "source": [
    "b =a.unsqueeze(0)\n",
    "print(b.shape)\n",
    "b =b.unsqueeze(3)\n",
    "print(b.shape)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### torch.expand()\n",
    "只能对**维度为1**的进行操作"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 182,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "torch.Size([4, 2, 4, 4])\n"
     ]
    }
   ],
   "source": [
    "c = b.expand(4, 2, 4, 4)# 不能扩展成（4,4,4,4）,第一维必须为2，第二维必须为4\n",
    "print(c.shape)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 13.torch.normal(means, std, out=None)\n",
    "## np.random.normal()\n",
    "* **返回一个张量，包含从给定参数means,std的离散正态分布中抽取随机数**\n",
    "   * 均值means是一个张量，包含每个输出元素相关的正态分布的均值。 \n",
    "   * std是一个张量，包含每个输出元素相关的正态分布的标准差。 \n",
    "   * 输出的值赋在shape里，默认为None\n",
    "\n",
    "均值和标准差的形状不须匹配，但每个张量的元素个数须相同\n",
    "***\n",
    "* **参数:**\n",
    "    * means (Tensor) – 均值  \n",
    "    * std (Tensor) – 标准差  \n",
    "    * out (Tensor) – 可选的输出张量  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 195,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "tensor([[ 2.5757e-01, -3.7227e-01, -6.0500e-01, -3.7617e-01, -2.7853e-01,\n",
      "          7.3592e-01, -4.2723e-01, -8.9442e-01,  3.9149e-01, -2.6117e-01,\n",
      "         -2.0960e-01, -3.5836e-01,  2.9740e-01, -4.3403e-01, -1.2592e+00,\n",
      "          3.9073e-01, -2.8825e-01, -3.6622e-01, -1.5372e-01, -6.6621e-01,\n",
      "          1.0600e-01, -6.9497e-01,  1.5976e-01,  1.2380e-01,  2.2066e-01,\n",
      "         -5.0918e-02,  4.3253e-01, -4.6806e-01,  8.1020e-02, -5.8199e-01,\n",
      "         -1.2223e-01, -3.9001e-01,  1.7252e-01, -5.6868e-02,  3.8596e-02,\n",
      "         -2.3697e-01, -3.2372e-01, -8.8554e-02, -2.7369e-01,  4.2165e-01,\n",
      "         -6.8895e-03,  5.1005e-01, -3.0526e-01, -4.0226e-01, -5.1415e-01,\n",
      "         -2.3959e-01, -1.4081e-01,  4.7264e-01, -4.9965e-01,  8.0841e-01,\n",
      "          1.5999e-01, -3.6906e-01, -3.6168e-01, -3.5070e-01,  5.0715e-01,\n",
      "         -6.0298e-01, -1.2857e-01,  6.4168e-02, -4.9213e-01,  2.6868e-01,\n",
      "         -8.1608e-01, -1.0447e-01, -5.9559e-01,  1.8083e-01, -4.7199e-02,\n",
      "         -1.4171e-01,  1.6522e-01,  1.0613e+00, -2.2128e-01, -7.0247e-01,\n",
      "          3.6045e-02,  3.2529e-01, -3.9855e-01, -6.9497e-01, -1.7547e-01,\n",
      "          2.1746e-01, -4.8284e-01,  3.6161e-02, -4.6796e-01, -4.1732e-02,\n",
      "         -8.7764e-02,  6.4434e-01, -4.4768e-01,  1.9986e-01, -3.4368e-01,\n",
      "         -6.1584e-01,  4.2481e-01, -3.8855e-01, -4.0725e-01,  4.2007e-01,\n",
      "          1.0365e-01,  4.2407e-01,  1.3008e-01,  8.4898e-01,  4.4827e-01,\n",
      "         -2.1733e-01, -1.5529e-01, -2.0296e-01, -6.1170e-01,  1.1023e+00,\n",
      "          9.2014e-01, -8.7255e-01, -7.7405e-01, -4.6970e-01,  7.8198e-02,\n",
      "         -9.6882e-01,  2.7980e-01, -8.1403e-01, -2.9606e-01, -7.0579e-01,\n",
      "          5.9577e-01,  2.0763e-01, -2.7669e-01,  7.3405e-01, -2.7351e-01,\n",
      "          3.8160e-01, -2.3809e-01, -3.0094e-02, -7.6513e-01, -5.4688e-01,\n",
      "          3.3695e-01, -7.2211e-01, -2.2812e-01,  3.3315e-02,  4.9599e-01,\n",
      "          5.4016e-01, -2.5786e-01, -2.3193e-01, -1.0764e+00,  4.0439e-01,\n",
      "          2.9911e-01,  1.0781e-01,  3.1251e-01, -1.7527e+00, -3.1011e-01,\n",
      "         -2.7395e-01, -3.4693e-01, -6.5757e-01, -6.7358e-02,  1.4823e-01,\n",
      "          6.8490e-01,  2.7484e-01,  1.7502e-01,  7.1001e-01, -2.6153e-01,\n",
      "          5.3257e-01,  3.2808e-01,  3.4025e-01,  6.4560e-01, -3.1140e-01,\n",
      "         -4.2298e-01,  1.8723e-01,  2.0443e-02, -2.3915e-01, -7.2959e-01,\n",
      "         -2.2373e-01,  3.9304e-01, -2.1016e-01, -7.6236e-02, -4.7291e-01,\n",
      "         -8.7992e-01,  4.7615e-01,  1.0845e+00,  6.4872e-01, -2.0388e-02,\n",
      "          2.0642e-01,  7.4873e-01,  1.2115e-01, -1.0420e-01, -6.9155e-01,\n",
      "          2.4857e-01,  5.0425e-01,  2.8360e-01, -2.1399e-01, -2.8753e-01,\n",
      "          6.1797e-01,  9.7777e-02,  4.8221e-02,  3.5560e-01,  3.8353e-02,\n",
      "          6.0496e-02, -2.9087e-02, -5.3846e-01, -3.9625e-01,  2.1610e-01,\n",
      "         -4.9260e-01,  6.4995e-02,  1.7581e-01,  3.8887e-01, -1.0078e+00,\n",
      "         -1.5813e-01,  8.1343e-01, -6.0249e-01, -5.2367e-01, -1.1197e+00,\n",
      "          1.5907e-01, -4.2807e-01,  6.5522e-02,  8.2460e-01,  5.3703e-01,\n",
      "          6.8721e-01,  4.8802e-01,  2.7795e-01,  3.5862e-01, -6.6203e-01,\n",
      "          3.3431e-01, -1.7600e-01, -4.1386e-01, -5.0601e-02, -5.8412e-01,\n",
      "         -6.2391e-02, -3.4907e-01,  2.9666e-01,  6.5803e-01,  3.4664e-01,\n",
      "         -2.0082e-01,  2.4172e-01, -4.2974e-02,  5.6400e-01,  6.7632e-01,\n",
      "          3.6185e-01,  2.4527e-02,  4.2174e-01, -2.6876e-03,  4.4980e-02,\n",
      "          4.4761e-01, -6.3046e-02, -9.8006e-01, -3.3760e-01,  4.2060e-01,\n",
      "          1.6172e-01,  7.3211e-02, -6.8392e-01, -6.6285e-01, -5.2277e-01,\n",
      "         -6.2502e-01,  1.7946e-01, -6.5582e-01, -1.2645e-01, -6.9658e-01,\n",
      "          2.3622e-01, -1.3137e-01, -4.6901e-02,  1.1070e-01, -1.0360e+00,\n",
      "         -1.2025e-02, -7.2504e-01,  9.4608e-02,  9.9807e-01, -3.0880e-01,\n",
      "         -9.1185e-01, -1.9507e-01, -1.9800e-01,  8.5007e-02, -5.3267e-01,\n",
      "         -9.8596e-01, -6.8375e-01, -4.9180e-01,  3.5735e-01,  5.7765e-01,\n",
      "          1.2875e-01, -1.8377e-01, -7.6912e-01, -1.0918e-02, -4.2027e-01,\n",
      "         -9.6759e-01,  5.1977e-01, -2.2848e-01,  4.0723e-01,  9.9787e-02,\n",
      "         -1.8057e-01,  5.5181e-01, -3.4417e-01,  3.5612e-02,  1.9265e-01,\n",
      "         -4.9161e-01,  4.4925e-01,  4.5807e-01, -1.4264e-01, -3.5955e-01,\n",
      "         -4.7674e-01, -3.6979e-01,  4.5150e-01, -2.4512e-01, -1.0586e+00,\n",
      "          6.3155e-01, -1.6168e+00, -5.9137e-01,  6.4422e-01,  2.9588e-01,\n",
      "         -9.6362e-02,  5.0301e-01,  3.6012e-01,  4.7931e-01,  3.4711e-01,\n",
      "          5.5290e-01,  5.8326e-01, -4.3863e-01,  6.4565e-01, -8.0609e-01,\n",
      "         -2.3966e-04, -8.9294e-02, -3.2086e-01, -6.5978e-01, -3.0603e-01,\n",
      "         -2.5831e-03,  1.0153e-01,  1.8501e-01,  6.5405e-01,  1.6951e+00,\n",
      "          3.6995e-01, -4.2556e-01,  3.1624e-01,  1.5643e-03, -4.8287e-01,\n",
      "          9.9050e-01,  1.4843e-01,  3.8377e-01,  5.9938e-01,  7.9668e-02,\n",
      "          8.6849e-01, -4.0035e-01, -3.2311e-01,  8.3743e-01,  4.2387e-01,\n",
      "          1.7137e-01, -4.5672e-01, -4.0031e-01,  8.2270e-03,  8.2149e-02,\n",
      "         -2.0245e-01, -2.2729e-01,  1.9747e-01,  2.2508e-01, -4.0903e-01,\n",
      "          5.2516e-01,  1.4494e-01, -5.7811e-01,  3.7537e-01,  4.4689e-01,\n",
      "          4.8786e-01, -1.4210e-01,  1.3641e+00, -2.2168e-02, -3.4200e-01,\n",
      "         -1.1408e-01, -2.2468e-01,  5.6927e-01,  1.5903e-01,  1.0942e+00,\n",
      "         -5.4550e-01,  3.1555e-01,  2.9205e-02,  1.2766e-01,  7.5952e-02,\n",
      "          7.8538e-01,  3.0811e-01,  3.2872e-01, -9.0522e-01, -7.1880e-01,\n",
      "         -1.7342e-01, -6.0462e-01,  1.0369e-01,  6.8304e-01,  2.8780e-01,\n",
      "          1.0879e+00, -6.2358e-01,  4.6271e-01, -4.4014e-01,  4.5961e-01,\n",
      "          5.8980e-01,  3.1064e-02, -5.2570e-02, -1.2470e-02, -7.5193e-01,\n",
      "          4.6474e-01, -2.6677e-01,  6.4928e-01,  9.0523e-02,  8.0036e-01,\n",
      "          3.9297e-01,  1.3141e-01, -1.1654e-01,  2.9132e-01, -6.7784e-01,\n",
      "          5.4575e-01, -3.2739e-01, -3.3938e-01,  3.1492e-01, -9.2581e-01,\n",
      "         -7.4114e-01,  9.7378e-01,  3.3406e-01,  2.3791e-01, -3.2743e-01,\n",
      "         -7.4106e-01,  1.1115e-01,  1.9603e-01, -5.9324e-01, -4.4811e-01,\n",
      "         -5.1010e-01,  5.0574e-01,  3.6181e-01,  6.1597e-01, -2.0019e-01,\n",
      "          4.3904e-01,  4.6018e-01, -2.8984e-01, -5.5379e-01, -5.7829e-01,\n",
      "         -1.5074e+00,  4.8868e-01, -6.5621e-01,  4.5143e-01,  2.1556e-01,\n",
      "          1.9824e-01, -2.3375e-01, -9.3164e-01,  3.1425e-01,  4.1944e-01,\n",
      "          6.0673e-01,  4.4873e-01, -8.6607e-01, -1.1319e-01, -3.5048e-01,\n",
      "         -1.0040e-01, -2.3897e-01,  2.2933e-01,  2.1801e-01, -7.5690e-01,\n",
      "          2.7965e-01, -5.8762e-01, -6.9841e-01, -8.9750e-01, -5.0553e-01,\n",
      "         -6.8379e-01,  2.3325e-01,  1.0669e+00,  3.5554e-01, -5.3262e-01,\n",
      "          8.2928e-01, -7.3895e-01, -1.0854e+00,  2.2990e-02,  4.2901e-01,\n",
      "         -1.0435e+00, -7.3134e-01,  1.2926e-01,  4.3275e-01,  9.6798e-02,\n",
      "          3.5681e-01,  2.8894e-01,  4.5629e-01, -1.9121e-01,  8.8378e-01,\n",
      "         -1.6446e-01,  1.2124e-01,  9.8499e-01,  2.3441e-01, -7.5422e-01,\n",
      "          6.2693e-01,  2.0198e-01, -8.5129e-01,  3.0353e-01,  7.7258e-01,\n",
      "         -3.1241e-03,  1.0891e-01, -4.8351e-02, -7.7580e-01,  3.6554e-02,\n",
      "          2.9371e-03, -3.2033e-01,  8.9082e-01,  3.7285e-02, -4.9787e-01,\n",
      "         -2.4741e-01,  1.6453e-01, -1.3823e+00,  2.7075e-01,  8.5447e-02,\n",
      "          1.1108e-01, -8.2964e-02,  2.9510e-01,  2.4868e-01, -3.2891e-01,\n",
      "         -1.6030e-01, -1.6765e-01, -7.1399e-02,  2.9765e-01, -7.4610e-01,\n",
      "         -5.0347e-01, -2.7596e-01, -1.4658e-01,  3.8961e-01,  1.6709e-02,\n",
      "          2.9958e-01,  8.1925e-02,  5.6093e-01, -2.9696e-01, -2.8136e-01,\n",
      "          2.8596e-01,  3.1301e-01,  9.8424e-01,  1.7510e-01, -3.4338e-01,\n",
      "          3.4114e-01, -2.4258e-01, -6.8922e-01,  1.9316e-01,  5.0964e-01,\n",
      "          7.8978e-01,  1.2918e+00, -1.7573e-01, -2.3286e-01,  3.3721e-01,\n",
      "          2.3448e-01, -7.1771e-01,  5.1510e-01,  1.2245e-01, -2.5029e-01,\n",
      "         -7.3756e-01, -8.7988e-01,  1.6273e-01, -1.1754e+00,  3.5713e-01,\n",
      "          4.2126e-01,  6.6642e-01, -2.6917e-01,  2.2691e-01,  3.3621e-01,\n",
      "          3.7683e-01, -4.4153e-02,  9.2985e-01, -4.7733e-01,  6.7742e-01,\n",
      "         -1.1149e+00, -3.4532e-01, -6.3488e-01, -6.9722e-01,  6.9308e-02,\n",
      "         -3.1293e-03, -3.0645e-01,  1.5457e-01, -7.5316e-01,  1.4964e-01,\n",
      "          6.7070e-01, -3.1774e-01, -4.9550e-01,  4.5427e-01,  5.1126e-01,\n",
      "         -4.1590e-01, -7.5595e-01, -4.3680e-01,  7.2065e-01,  2.6752e-01,\n",
      "         -1.7167e-01, -3.4960e-01,  2.9668e-01, -3.2916e-01,  1.9754e-01,\n",
      "          7.6536e-01,  7.4755e-01,  2.0876e-01, -1.6082e-01, -3.4553e-01,\n",
      "          3.6746e-01, -6.5266e-01,  3.0293e-01,  1.1480e-01, -1.8581e-01,\n",
      "          1.2176e+00, -4.2203e-01,  5.1764e-01,  3.5913e-01, -2.4412e-01,\n",
      "          3.0069e-01, -2.1614e-01,  1.6038e-01,  5.0952e-02,  7.3426e-01,\n",
      "         -6.8195e-01,  1.4976e-04,  6.9798e-01,  1.2410e-01, -6.6031e-01,\n",
      "         -1.2178e-01, -4.2556e-01,  1.3413e-02,  8.2643e-01,  6.9305e-01,\n",
      "          5.0927e-01,  5.3552e-02,  4.3213e-01,  2.7382e-01,  3.7584e-02,\n",
      "         -1.1912e-02,  2.1285e-01, -1.0244e+00,  1.2249e-01,  1.9880e-01,\n",
      "         -3.3942e-01, -5.2835e-01,  4.6761e-01,  1.8186e-01,  1.4225e-01,\n",
      "         -2.0778e-01, -1.2790e-01, -5.1610e-02,  4.5974e-01,  6.1838e-02,\n",
      "         -1.2951e-01, -3.4446e-01,  1.7898e-01, -4.3854e-01,  1.6562e-01,\n",
      "         -4.5485e-01,  5.9420e-01, -5.3104e-01, -3.4549e-01, -2.9065e-01,\n",
      "         -2.4120e-01, -6.0518e-01,  1.3273e+00,  3.3678e-01,  5.7893e-01,\n",
      "         -8.8727e-01,  2.3520e-02,  1.3803e-01, -1.8077e+00, -3.6780e-01,\n",
      "          2.3603e-01, -6.9758e-01, -8.1089e-01,  3.0391e-02, -4.1478e-01,\n",
      "          1.9988e-01,  5.0565e-01,  3.0769e-01,  4.4700e-01,  3.5723e-02,\n",
      "          3.8770e-01, -2.9080e-01,  1.3639e-02, -1.7336e-01,  6.0689e-01,\n",
      "         -3.2066e-02,  1.1251e-01, -6.9358e-01,  3.1103e-01, -4.0052e-02,\n",
      "          4.5265e-01,  5.7129e-01, -8.9223e-02, -2.7087e-01, -2.6870e-01,\n",
      "         -2.0056e-01, -4.5840e-01, -4.1919e-01,  3.3923e-01,  2.0283e-01,\n",
      "         -2.8505e-01,  1.0947e+00,  9.6933e-01,  3.7587e-01,  4.9177e-01,\n",
      "         -2.1119e-01, -6.1639e-01, -5.0455e-01,  7.9874e-01,  1.4966e-02,\n",
      "          2.0985e-01,  4.9963e-01, -8.2175e-02,  1.3733e-02, -3.3859e-01,\n",
      "          5.7707e-01,  8.6294e-01,  5.4875e-01,  6.2493e-01,  9.0502e-02,\n",
      "          1.1163e-01, -6.4851e-01, -3.8360e-01,  8.8081e-01, -8.4393e-02,\n",
      "          2.7936e-02,  5.1549e-01, -1.4402e-01,  6.9455e-01,  2.7630e-01,\n",
      "         -1.3649e-01,  2.3981e-01,  5.7364e-01,  4.5729e-01,  3.5722e-01,\n",
      "         -4.3420e-01, -1.8284e-01,  4.2885e-01, -5.9347e-01, -1.0515e-01,\n",
      "          1.1047e+00, -1.0295e-01, -4.7733e-01,  5.8916e-01,  1.0309e+00,\n",
      "         -8.6788e-03, -1.6622e-01, -1.9823e-01, -1.2976e-01,  4.6918e-01,\n",
      "          6.0682e-01, -3.0031e-01,  8.8782e-01, -3.8358e-01, -5.0823e-01,\n",
      "         -2.8651e-01, -1.1067e-01, -5.8792e-01, -4.0151e-01, -2.4769e-01,\n",
      "         -9.5186e-03,  4.2404e-01,  2.0981e-01, -8.8119e-01,  5.8868e-01,\n",
      "          6.7367e-02, -2.7271e-01,  3.5980e-01,  7.6741e-01,  3.5739e-01,\n",
      "          6.7012e-01, -3.4088e-01, -1.5748e-01,  1.5057e+00,  2.6519e-02,\n",
      "          5.1673e-01, -9.9998e-02,  5.9687e-01, -2.4476e-01,  3.8403e-01,\n",
      "         -5.8096e-02, -6.4609e-01, -2.8344e-01, -8.6560e-01,  2.5306e-01,\n",
      "         -4.8050e-01, -2.0449e-01,  4.8004e-01, -5.4584e-02,  4.5796e-01,\n",
      "         -2.3033e-01, -4.6578e-01, -3.4342e-01,  1.4475e+00,  6.7010e-01,\n",
      "          1.7109e-01, -3.4202e-01,  5.1357e-02, -4.5872e-01,  8.1604e-01,\n",
      "         -4.7689e-01, -1.6662e+00, -9.6572e-02, -8.8670e-02,  3.5171e-01,\n",
      "         -3.8702e-01,  4.2194e-02,  8.4630e-01, -1.0692e+00, -3.6704e-01,\n",
      "          6.6076e-01,  4.4237e-02,  6.1154e-01,  4.6470e-01,  6.8614e-01,\n",
      "         -4.6007e-01, -8.2604e-02,  1.8571e-01, -3.2618e-01, -4.0918e-01,\n",
      "         -8.7715e-02, -5.4839e-02,  7.1163e-01,  7.2539e-01,  9.9370e-01,\n",
      "          7.2808e-03,  5.4346e-01, -3.7593e-01,  2.6686e-01, -1.2185e-01,\n",
      "         -3.9816e-01, -8.4228e-01, -6.2539e-02, -1.4061e-01, -1.3444e+00,\n",
      "          3.3613e-01, -5.6767e-02, -2.2434e-01, -1.0875e-02,  7.9075e-01,\n",
      "          6.5785e-01,  5.4597e-01, -4.7665e-01, -1.7786e+00,  1.1081e-01,\n",
      "          8.9335e-01,  3.5276e-01,  1.6789e-01, -8.7962e-02, -6.9929e-01,\n",
      "          9.5702e-01, -7.1734e-01,  6.3612e-01,  4.6341e-01,  8.9630e-02,\n",
      "         -4.9263e-02,  5.9141e-02, -4.1925e-01,  7.0274e-02,  2.8735e-01,\n",
      "         -8.4475e-01,  1.5524e-01,  7.0004e-01,  6.9354e-01,  6.6459e-03,\n",
      "          1.3953e-01,  3.3361e-01,  7.4472e-01, -1.2294e-01, -8.9206e-01,\n",
      "         -5.0183e-01,  7.3864e-01,  6.9543e-01, -6.8850e-01,  5.8868e-01,\n",
      "          4.9004e-01,  3.4689e-01,  2.2946e-01,  1.2927e+00,  7.8621e-01,\n",
      "         -2.8296e-01, -6.4863e-01,  2.8024e-01,  7.3892e-01,  1.0920e-02,\n",
      "         -8.2960e-02, -1.9929e-01, -9.5978e-02,  5.2065e-01,  9.2697e-01,\n",
      "         -3.6157e-01,  4.0313e-01, -6.1730e-01, -8.3473e-02, -5.0076e-01,\n",
      "          4.6492e-01,  7.1164e-01, -2.8803e-01,  3.4909e-01, -3.8378e-01,\n",
      "          5.7691e-01, -2.7047e-01,  6.9128e-01, -1.0736e-01, -7.2942e-01,\n",
      "         -3.8604e-01,  5.6872e-01, -4.4978e-03,  6.9338e-01, -6.1790e-01,\n",
      "         -4.8188e-01,  1.0263e+00, -4.4309e-01, -5.0530e-01,  3.4983e-01,\n",
      "         -1.5314e-01, -1.1056e-01,  9.0930e-01, -3.7231e-01, -6.1096e-01,\n",
      "          1.0657e+00, -7.9545e-01,  2.6177e-01,  1.2446e-01,  5.1505e-01,\n",
      "          1.6549e-01, -3.3914e-01, -1.8549e-01,  2.1563e-01, -4.9661e-01,\n",
      "          1.0093e+00,  2.6533e-01,  5.3117e-01,  4.0937e-01,  2.2200e-01,\n",
      "          2.0811e-01,  7.9322e-01, -7.7892e-01,  4.4550e-01, -2.3918e-03,\n",
      "          7.2959e-01,  6.4133e-01,  5.4806e-01,  1.3807e-01,  5.7797e-01,\n",
      "         -2.1713e-01,  2.7082e-01,  8.4299e-02,  4.6563e-01,  3.7014e-01,\n",
      "          5.6026e-03, -3.7986e-01,  6.4706e-01,  1.5812e-02,  5.0238e-02,\n",
      "         -3.0348e-01,  4.8486e-01,  6.9457e-02,  3.1062e-01, -2.7330e-01,\n",
      "          9.1580e-02, -3.5359e-01, -5.6480e-01, -1.1094e-01,  5.1766e-01,\n",
      "          6.1820e-02, -5.0482e-03, -5.4200e-01,  4.8793e-02,  3.2439e-01,\n",
      "         -1.5476e-01,  2.3114e-01, -9.9136e-01,  5.1293e-01,  1.9684e-01,\n",
      "          5.1073e-01, -6.8809e-01, -6.1709e-01, -4.1938e-02, -9.6322e-01,\n",
      "          3.3194e-01, -2.9951e-01, -4.7664e-01, -2.1348e-01, -2.8536e-01,\n",
      "         -1.0011e-01,  2.6159e-01,  2.2522e-01,  6.2717e-01, -2.0267e-01,\n",
      "         -9.4475e-02,  3.8487e-03,  1.4191e-01, -2.5353e-01, -3.7382e-01,\n",
      "          7.7230e-01,  4.5850e-01,  6.6663e-01,  3.0062e-01,  1.6368e-01,\n",
      "         -1.1339e-01, -2.0950e-01, -4.2077e-01, -4.7329e-01,  9.0818e-02,\n",
      "          5.5276e-01, -7.9752e-01, -2.9526e-01,  1.4523e-01, -1.0579e+00,\n",
      "         -7.9071e-01,  6.1506e-01, -8.5069e-01,  3.4302e-01, -8.6709e-01,\n",
      "          3.3377e-01,  2.9391e-01,  7.1695e-01,  6.8435e-01,  4.8072e-01,\n",
      "         -6.3843e-01,  4.6348e-02,  4.4014e-01, -7.9116e-01, -8.3392e-02,\n",
      "         -2.8591e-01,  1.7509e-01, -7.7598e-01,  5.6945e-01,  1.8878e-01,\n",
      "         -4.5312e-01, -2.4339e-01,  5.0776e-01,  5.0533e-01, -5.7813e-01,\n",
      "         -2.2975e-01,  3.1051e-01, -4.7806e-01, -6.3707e-03, -4.9082e-01]])\n",
      "[ 2.57574171e-01 -3.72268677e-01 -6.05004787e-01 -3.76172543e-01\n",
      " -2.78527558e-01  7.35919714e-01 -4.27229792e-01 -8.94424736e-01\n",
      "  3.91492516e-01 -2.61170357e-01 -2.09595233e-01 -3.58356416e-01\n",
      "  2.97396153e-01 -4.34030414e-01 -1.25922418e+00  3.90733421e-01\n",
      " -2.88249582e-01 -3.66215914e-01 -1.53723851e-01 -6.66207552e-01\n",
      "  1.05997309e-01 -6.94972456e-01  1.59761444e-01  1.23801462e-01\n",
      "  2.20661432e-01 -5.09180687e-02  4.32531804e-01 -4.68055099e-01\n",
      "  8.10200274e-02 -5.81987858e-01 -1.22228839e-01 -3.90012175e-01\n",
      "  1.72522917e-01 -5.68681620e-02  3.85963768e-02 -2.36968115e-01\n",
      " -3.23720843e-01 -8.85537565e-02 -2.73689359e-01  4.21650290e-01\n",
      " -6.88948436e-03  5.10047138e-01 -3.05261761e-01 -4.02264088e-01\n",
      " -5.14151394e-01 -2.39588782e-01 -1.40814587e-01  4.72641945e-01\n",
      " -4.99648303e-01  8.08409989e-01  1.59987122e-01 -3.69061619e-01\n",
      " -3.61681998e-01 -3.50699097e-01  5.07152796e-01 -6.02979302e-01\n",
      " -1.28572077e-01  6.41678944e-02 -4.92126018e-01  2.68684566e-01\n",
      " -8.16083848e-01 -1.04469478e-01 -5.95593035e-01  1.80827692e-01\n",
      " -4.71994095e-02 -1.41713381e-01  1.65219769e-01  1.06133544e+00\n",
      " -2.21279562e-01 -7.02466846e-01  3.60447988e-02  3.25288266e-01\n",
      " -3.98547977e-01 -6.94968283e-01 -1.75474018e-01  2.17457786e-01\n",
      " -4.82843339e-01  3.61606963e-02 -4.67958748e-01 -4.17317972e-02\n",
      " -8.77644792e-02  6.44342959e-01 -4.47680026e-01  1.99860677e-01\n",
      " -3.43678951e-01 -6.15836859e-01  4.24805164e-01 -3.88550937e-01\n",
      " -4.07245606e-01  4.20071900e-01  1.03651725e-01  4.24072415e-01\n",
      "  1.30075648e-01  8.48978341e-01  4.48266834e-01 -2.17330143e-01\n",
      " -1.55285820e-01 -2.02956051e-01 -6.11697972e-01  1.10226250e+00\n",
      "  9.20135021e-01 -8.72553170e-01 -7.74048746e-01 -4.69700634e-01\n",
      "  7.81984776e-02 -9.68820989e-01  2.79798090e-01 -8.14027727e-01\n",
      " -2.96062678e-01 -7.05787420e-01  5.95767081e-01  2.07630038e-01\n",
      " -2.76685596e-01  7.34048605e-01 -2.73508191e-01  3.81601959e-01\n",
      " -2.38093808e-01 -3.00943740e-02 -7.65128613e-01 -5.46879351e-01\n",
      "  3.36953968e-01 -7.22114027e-01 -2.28117451e-01  3.33148688e-02\n",
      "  4.95986968e-01  5.40160358e-01 -2.57860690e-01 -2.31925681e-01\n",
      " -1.07639682e+00  4.04386818e-01  2.99109876e-01  1.07805669e-01\n",
      "  3.12509835e-01 -1.75269020e+00 -3.10111612e-01 -2.73947120e-01\n",
      " -3.46931249e-01 -6.57569170e-01 -6.73584044e-02  1.48232609e-01\n",
      "  6.84903920e-01  2.74839580e-01  1.75024062e-01  7.10005283e-01\n",
      " -2.61533648e-01  5.32565475e-01  3.28080773e-01  3.40247601e-01\n",
      "  6.45599842e-01 -3.11404318e-01 -4.22980845e-01  1.87227324e-01\n",
      "  2.04433482e-02 -2.39149153e-01 -7.29593515e-01 -2.23728135e-01\n",
      "  3.93041760e-01 -2.10163072e-01 -7.62357190e-02 -4.72912967e-01\n",
      " -8.79918039e-01  4.76150185e-01  1.08445132e+00  6.48720801e-01\n",
      " -2.03883201e-02  2.06423819e-01  7.48729825e-01  1.21153429e-01\n",
      " -1.04199752e-01 -6.91547573e-01  2.48571038e-01  5.04247546e-01\n",
      "  2.83603430e-01 -2.13988349e-01 -2.87529379e-01  6.17965698e-01\n",
      "  9.77766737e-02  4.82208543e-02  3.55595052e-01  3.83530892e-02\n",
      "  6.04962818e-02 -2.90865730e-02 -5.38460195e-01 -3.96245897e-01\n",
      "  2.16101944e-01 -4.92598087e-01  6.49953559e-02  1.75808489e-01\n",
      "  3.88874501e-01 -1.00783467e+00 -1.58125848e-01  8.13434362e-01\n",
      " -6.02490723e-01 -5.23665428e-01 -1.11971414e+00  1.59068719e-01\n",
      " -4.28068995e-01  6.55224174e-02  8.24595392e-01  5.37029088e-01\n",
      "  6.87211096e-01  4.88015264e-01  2.77947724e-01  3.58619511e-01\n",
      " -6.62032068e-01  3.34311515e-01 -1.76004857e-01 -4.13855612e-01\n",
      " -5.06009199e-02 -5.84121168e-01 -6.23914711e-02 -3.49071205e-01\n",
      "  2.96662807e-01  6.58034861e-01  3.46644461e-01 -2.00822771e-01\n",
      "  2.41717964e-01 -4.29741256e-02  5.64002037e-01  6.76316917e-01\n",
      "  3.61852705e-01  2.45268233e-02  4.21740055e-01 -2.68757995e-03\n",
      "  4.49800193e-02  4.47605819e-01 -6.30457401e-02 -9.80061233e-01\n",
      " -3.37595552e-01  4.20598537e-01  1.61722034e-01  7.32109621e-02\n",
      " -6.83920085e-01 -6.62846565e-01 -5.22767305e-01 -6.25023663e-01\n",
      "  1.79459587e-01 -6.55816793e-01 -1.26454800e-01 -6.96575642e-01\n",
      "  2.36219436e-01 -1.31373823e-01 -4.69009131e-02  1.10697545e-01\n",
      " -1.03597474e+00 -1.20247370e-02 -7.25040138e-01  9.46080983e-02\n",
      "  9.98069823e-01 -3.08795303e-01 -9.11848724e-01 -1.95067167e-01\n",
      " -1.98003083e-01  8.50070938e-02 -5.32672167e-01 -9.85958159e-01\n",
      " -6.83752656e-01 -4.91801471e-01  3.57347220e-01  5.77645898e-01\n",
      "  1.28745109e-01 -1.83766067e-01 -7.69120872e-01 -1.09181227e-02\n",
      " -4.20268118e-01 -9.67586637e-01  5.19766450e-01 -2.28476807e-01\n",
      "  4.07225877e-01  9.97868627e-02 -1.80571541e-01  5.51810443e-01\n",
      " -3.44167233e-01  3.56119275e-02  1.92651555e-01 -4.91608799e-01\n",
      "  4.49252754e-01  4.58067268e-01 -1.42635360e-01 -3.59549731e-01\n",
      " -4.76739019e-01 -3.69794309e-01  4.51498508e-01 -2.45119467e-01\n",
      " -1.05857921e+00  6.31545603e-01 -1.61680591e+00 -5.91372669e-01\n",
      "  6.44220889e-01  2.95881778e-01 -9.63619649e-02  5.03014266e-01\n",
      "  3.60124469e-01  4.79306519e-01  3.47113013e-01  5.52902162e-01\n",
      "  5.83257079e-01 -4.38628525e-01  6.45648897e-01 -8.06088507e-01\n",
      " -2.39659203e-04 -8.92939642e-02 -3.20863754e-01 -6.59775198e-01\n",
      " -3.06027293e-01 -2.58312235e-03  1.01533137e-01  1.85007438e-01\n",
      "  6.54047728e-01  1.69508743e+00  3.69951546e-01 -4.25562710e-01\n",
      "  3.16241026e-01  1.56431214e-03 -4.82874095e-01  9.90498245e-01\n",
      "  1.48434445e-01  3.83769304e-01  5.99379718e-01  7.96675086e-02\n",
      "  8.68494868e-01 -4.00347859e-01 -3.23112905e-01  8.37427020e-01\n",
      "  4.23871934e-01  1.71369269e-01 -4.56718147e-01 -4.00313884e-01\n",
      "  8.22698232e-03  8.21489096e-02 -2.02453256e-01 -2.27289379e-01\n",
      "  1.97467998e-01  2.25084752e-01 -4.09027606e-01  5.25156319e-01\n",
      "  1.44942120e-01 -5.78107357e-01  3.75372887e-01  4.46890205e-01\n",
      "  4.87861723e-01 -1.42102718e-01  1.36408961e+00 -2.21676435e-02\n",
      " -3.41999769e-01 -1.14081934e-01 -2.24684820e-01  5.69270670e-01\n",
      "  1.59034416e-01  1.09419346e+00 -5.45504510e-01  3.15552443e-01\n",
      "  2.92054564e-02  1.27664030e-01  7.59517103e-02  7.85380125e-01\n",
      "  3.08105409e-01  3.28723937e-01 -9.05222833e-01 -7.18798041e-01\n",
      " -1.73422858e-01 -6.04622126e-01  1.03694759e-01  6.83043063e-01\n",
      "  2.87795424e-01  1.08794940e+00 -6.23575926e-01  4.62713093e-01\n",
      " -4.40136671e-01  4.59605306e-01  5.89804649e-01  3.10637280e-02\n",
      " -5.25700785e-02 -1.24702035e-02 -7.51928270e-01  4.64735448e-01\n",
      " -2.66767323e-01  6.49276674e-01  9.05228704e-02  8.00355911e-01\n",
      "  3.92966539e-01  1.31410375e-01 -1.16540954e-01  2.91318417e-01\n",
      " -6.77840710e-01  5.45745313e-01 -3.27389747e-01 -3.39379966e-01\n",
      "  3.14924121e-01 -9.25810754e-01 -7.41142929e-01  9.73784983e-01\n",
      "  3.34056407e-01  2.37910613e-01 -3.27431530e-01 -7.41059422e-01\n",
      "  1.11152709e-01  1.96025655e-01 -5.93240559e-01 -4.48112190e-01\n",
      " -5.10101736e-01  5.05738318e-01  3.61813754e-01  6.15966320e-01\n",
      " -2.00185731e-01  4.39035058e-01  4.60182339e-01 -2.89841741e-01\n",
      " -5.53793490e-01 -5.78286350e-01 -1.50736284e+00  4.88676488e-01\n",
      " -6.56214178e-01  4.51425165e-01  2.15557024e-01  1.98235169e-01\n",
      " -2.33749226e-01 -9.31644857e-01  3.14246416e-01  4.19443518e-01\n",
      "  6.06728554e-01  4.48732793e-01 -8.66069257e-01 -1.13190584e-01\n",
      " -3.50481451e-01 -1.00398898e-01 -2.38965720e-01  2.29329646e-01\n",
      "  2.18008250e-01 -7.56903350e-01  2.79652148e-01 -5.87623060e-01\n",
      " -6.98411345e-01 -8.97504807e-01 -5.05528808e-01 -6.83794200e-01\n",
      "  2.33254850e-01  1.06693006e+00  3.55544716e-01 -5.32616377e-01\n",
      "  8.29275548e-01 -7.38951027e-01 -1.08536530e+00  2.29896884e-02\n",
      "  4.29008812e-01 -1.04345715e+00 -7.31336772e-01  1.29262254e-01\n",
      "  4.32747066e-01  9.67982411e-02  3.56809944e-01  2.88936228e-01\n",
      "  4.56294864e-01 -1.91211119e-01  8.83781612e-01 -1.64458483e-01\n",
      "  1.21242508e-01  9.84987855e-01  2.34405696e-01 -7.54221320e-01\n",
      "  6.26928747e-01  2.01981083e-01 -8.51294756e-01  3.03534657e-01\n",
      "  7.72584796e-01 -3.12408782e-03  1.08914703e-01 -4.83510308e-02\n",
      " -7.75802851e-01  3.65536548e-02  2.93708500e-03 -3.20331633e-01\n",
      "  8.90821993e-01  3.72845195e-02 -4.97869432e-01 -2.47405365e-01\n",
      "  1.64528072e-01 -1.38228285e+00  2.70750225e-01  8.54471251e-02\n",
      "  1.11083284e-01 -8.29642713e-02  2.95103192e-01  2.48678058e-01\n",
      " -3.28911364e-01 -1.60300732e-01 -1.67651609e-01 -7.13993907e-02\n",
      "  2.97647804e-01 -7.46104836e-01 -5.03467500e-01 -2.75964379e-01\n",
      " -1.46583378e-01  3.89608324e-01  1.67094897e-02  2.99582392e-01\n",
      "  8.19245726e-02  5.60932696e-01 -2.96956778e-01 -2.81359524e-01\n",
      "  2.85962760e-01  3.13006252e-01  9.84239399e-01  1.75097585e-01\n",
      " -3.43377471e-01  3.41137975e-01 -2.42581710e-01 -6.89221203e-01\n",
      "  1.93159804e-01  5.09638011e-01  7.89775789e-01  1.29179680e+00\n",
      " -1.75730944e-01 -2.32858628e-01  3.37209731e-01  2.34482303e-01\n",
      " -7.17713058e-01  5.15104175e-01  1.22454181e-01 -2.50291735e-01\n",
      " -7.37564266e-01 -8.79884720e-01  1.62732258e-01 -1.17537940e+00\n",
      "  3.57131749e-01  4.21258569e-01  6.66417837e-01 -2.69173771e-01\n",
      "  2.26909772e-01  3.36210370e-01  3.76830101e-01 -4.41534854e-02\n",
      "  9.29845691e-01 -4.77325052e-01  6.77424967e-01 -1.11491692e+00\n",
      " -3.45323890e-01 -6.34880781e-01 -6.97218478e-01  6.93079904e-02\n",
      " -3.12926038e-03 -3.06449771e-01  1.54572651e-01 -7.53156602e-01\n",
      "  1.49643630e-01  6.70700848e-01 -3.17742616e-01 -4.95503247e-01\n",
      "  4.54265654e-01  5.11261821e-01 -4.15902883e-01 -7.55954683e-01\n",
      " -4.36797798e-01  7.20651448e-01  2.67519444e-01 -1.71665028e-01\n",
      " -3.49597633e-01  2.96680361e-01 -3.29161137e-01  1.97535187e-01\n",
      "  7.65358269e-01  7.47550488e-01  2.08760068e-01 -1.60823420e-01\n",
      " -3.45525533e-01  3.67461592e-01 -6.52659655e-01  3.02925557e-01\n",
      "  1.14800379e-01 -1.85809001e-01  1.21761179e+00 -4.22033310e-01\n",
      "  5.17639875e-01  3.59133959e-01 -2.44121403e-01  3.00691187e-01\n",
      " -2.16140643e-01  1.60379678e-01  5.09515181e-02  7.34263539e-01\n",
      " -6.81950033e-01  1.49755797e-04  6.97979748e-01  1.24102943e-01\n",
      " -6.60314798e-01 -1.21781521e-01 -4.25557554e-01  1.34134274e-02\n",
      "  8.26426864e-01  6.93048418e-01  5.09270012e-01  5.35521246e-02\n",
      "  4.32131469e-01  2.73819685e-01  3.75840925e-02 -1.19121643e-02\n",
      "  2.12851062e-01 -1.02436471e+00  1.22494332e-01  1.98797926e-01\n",
      " -3.39422196e-01 -5.28353751e-01  4.67613727e-01  1.81858703e-01\n",
      "  1.42252401e-01 -2.07777053e-01 -1.27899483e-01 -5.16096614e-02\n",
      "  4.59736645e-01  6.18384928e-02 -1.29508182e-01 -3.44461530e-01\n",
      "  1.78979829e-01 -4.38537151e-01  1.65622070e-01 -4.54851955e-01\n",
      "  5.94195962e-01 -5.31044364e-01 -3.45492750e-01 -2.90645570e-01\n",
      " -2.41199255e-01 -6.05181038e-01  1.32727861e+00  3.36776972e-01\n",
      "  5.78930557e-01 -8.87273550e-01  2.35201176e-02  1.38033360e-01\n",
      " -1.80766857e+00 -3.67799073e-01  2.36025736e-01 -6.97582841e-01\n",
      " -8.10888946e-01  3.03909946e-02 -4.14775997e-01  1.99882001e-01\n",
      "  5.05645812e-01  3.07689995e-01  4.47002590e-01  3.57233509e-02\n",
      "  3.87702167e-01 -2.90797859e-01  1.36391791e-02 -1.73364505e-01\n",
      "  6.06892467e-01 -3.20663340e-02  1.12506427e-01 -6.93579257e-01\n",
      "  3.11030984e-01 -4.00518477e-02  4.52650249e-01  5.71288884e-01\n",
      " -8.92227963e-02 -2.70867258e-01 -2.68697947e-01 -2.00555474e-01\n",
      " -4.58399355e-01 -4.19192225e-01  3.39234382e-01  2.02827618e-01\n",
      " -2.85053551e-01  1.09469914e+00  9.69334960e-01  3.75866920e-01\n",
      "  4.91769642e-01 -2.11192057e-01 -6.16390586e-01 -5.04547656e-01\n",
      "  7.98744202e-01  1.49657503e-02  2.09853068e-01  4.99634624e-01\n",
      " -8.21754634e-02  1.37332296e-02 -3.38590473e-01  5.77068388e-01\n",
      "  8.62937689e-01  5.48748434e-01  6.24934316e-01  9.05016959e-02\n",
      "  1.11625209e-01 -6.48507953e-01 -3.83604050e-01  8.80812347e-01\n",
      " -8.43925551e-02  2.79364865e-02  5.15494883e-01 -1.44017294e-01\n",
      "  6.94553077e-01  2.76297629e-01 -1.36485934e-01  2.39805818e-01\n",
      "  5.73635340e-01  4.57290024e-01  3.57218117e-01 -4.34195966e-01\n",
      " -1.82843253e-01  4.28851962e-01 -5.93472540e-01 -1.05150715e-01\n",
      "  1.10467088e+00 -1.02948584e-01 -4.77332562e-01  5.89164019e-01\n",
      "  1.03089678e+00 -8.67875107e-03 -1.66219264e-01 -1.98229834e-01\n",
      " -1.29761785e-01  4.69177306e-01  6.06819510e-01 -3.00306618e-01\n",
      "  8.87819171e-01 -3.83583069e-01 -5.08234918e-01 -2.86510646e-01\n",
      " -1.10674717e-01 -5.87919235e-01 -4.01514322e-01 -2.47687057e-01\n",
      " -9.51860938e-03  4.24044043e-01  2.09807947e-01 -8.81193519e-01\n",
      "  5.88683724e-01  6.73666894e-02 -2.72708207e-01  3.59802395e-01\n",
      "  7.67408729e-01  3.57385486e-01  6.70115173e-01 -3.40881526e-01\n",
      " -1.57476664e-01  1.50573969e+00  2.65190490e-02  5.16729534e-01\n",
      " -9.99976173e-02  5.96867621e-01 -2.44764656e-01  3.84025306e-01\n",
      " -5.80963455e-02 -6.46092296e-01 -2.83442378e-01 -8.65600049e-01\n",
      "  2.53059506e-01 -4.80501980e-01 -2.04491466e-01  4.80040014e-01\n",
      " -5.45838065e-02  4.57956195e-01 -2.30326489e-01 -4.65777248e-01\n",
      " -3.43422741e-01  1.44754565e+00  6.70095444e-01  1.71093494e-01\n",
      " -3.42017084e-01  5.13567291e-02 -4.58715647e-01  8.16042900e-01\n",
      " -4.76889372e-01 -1.66615009e+00 -9.65721905e-02 -8.86704177e-02\n",
      "  3.51708978e-01 -3.87023062e-01  4.21938822e-02  8.46303344e-01\n",
      " -1.06922948e+00 -3.67043376e-01  6.60764992e-01  4.42369841e-02\n",
      "  6.11540616e-01  4.64695245e-01  6.86138749e-01 -4.60072577e-01\n",
      " -8.26042965e-02  1.85709909e-01 -3.26183379e-01 -4.09175664e-01\n",
      " -8.77146721e-02 -5.48387058e-02  7.11632848e-01  7.25394309e-01\n",
      "  9.93702412e-01  7.28082424e-03  5.43461800e-01 -3.75926882e-01\n",
      "  2.66855925e-01 -1.21846609e-01 -3.98158401e-01 -8.42278123e-01\n",
      " -6.25387654e-02 -1.40605047e-01 -1.34435761e+00  3.36130023e-01\n",
      " -5.67665473e-02 -2.24335954e-01 -1.08751683e-02  7.90748179e-01\n",
      "  6.57846212e-01  5.45967281e-01 -4.76645797e-01 -1.77863240e+00\n",
      "  1.10808440e-01  8.93354833e-01  3.52758318e-01  1.67889997e-01\n",
      " -8.79615173e-02 -6.99287832e-01  9.57016051e-01 -7.17341959e-01\n",
      "  6.36119604e-01  4.63410139e-01  8.96296874e-02 -4.92625535e-02\n",
      "  5.91412410e-02 -4.19252306e-01  7.02735782e-02  2.87348896e-01\n",
      " -8.44746828e-01  1.55236900e-01  7.00037777e-01  6.93536758e-01\n",
      "  6.64594024e-03  1.39531896e-01  3.33608508e-01  7.44716287e-01\n",
      " -1.22938387e-01 -8.92063498e-01 -5.01828909e-01  7.38642514e-01\n",
      "  6.95434511e-01 -6.88496947e-01  5.88676989e-01  4.90042537e-01\n",
      "  3.46893877e-01  2.29455724e-01  1.29271364e+00  7.86210895e-01\n",
      " -2.82961190e-01 -6.48630381e-01  2.80241579e-01  7.38921940e-01\n",
      "  1.09196454e-02 -8.29600617e-02 -1.99293479e-01 -9.59779397e-02\n",
      "  5.20651639e-01  9.26966906e-01 -3.61567974e-01  4.03134346e-01\n",
      " -6.17299139e-01 -8.34732950e-02 -5.00755608e-01  4.64919716e-01\n",
      "  7.11635411e-01 -2.88032264e-01  3.49094778e-01 -3.83783638e-01\n",
      "  5.76911390e-01 -2.70468801e-01  6.91283166e-01 -1.07358515e-01\n",
      " -7.29424596e-01 -3.86035264e-01  5.68717182e-01 -4.49782005e-03\n",
      "  6.93382800e-01 -6.17899597e-01 -4.81877983e-01  1.02627623e+00\n",
      " -4.43087816e-01 -5.05295873e-01  3.49833488e-01 -1.53142557e-01\n",
      " -1.10560618e-01  9.09300327e-01 -3.72307867e-01 -6.10958993e-01\n",
      "  1.06570125e+00 -7.95452237e-01  2.61772573e-01  1.24458559e-01\n",
      "  5.15048742e-01  1.65486574e-01 -3.39137852e-01 -1.85493544e-01\n",
      "  2.15632662e-01 -4.96612668e-01  1.00934851e+00  2.65330076e-01\n",
      "  5.31171322e-01  4.09370422e-01  2.21998602e-01  2.08114997e-01\n",
      "  7.93216884e-01 -7.78916180e-01  4.45495158e-01 -2.39177095e-03\n",
      "  7.29591072e-01  6.41331434e-01  5.48061132e-01  1.38073474e-01\n",
      "  5.77974260e-01 -2.17125133e-01  2.70820111e-01  8.42991248e-02\n",
      "  4.65632975e-01  3.70137632e-01  5.60256932e-03 -3.79857600e-01\n",
      "  6.47062302e-01  1.58117861e-02  5.02379164e-02 -3.03482473e-01\n",
      "  4.84861970e-01  6.94574565e-02  3.10619771e-01 -2.73299694e-01\n",
      "  9.15797800e-02 -3.53592575e-01 -5.64800441e-01 -1.10938281e-01\n",
      "  5.17655373e-01  6.18196577e-02 -5.04815066e-03 -5.41998684e-01\n",
      "  4.87933159e-02  3.24392855e-01 -1.54759631e-01  2.31143162e-01\n",
      " -9.91358042e-01  5.12934446e-01  1.96836174e-01  5.10734797e-01\n",
      " -6.88085914e-01 -6.17089391e-01 -4.19379734e-02 -9.63217139e-01\n",
      "  3.31937164e-01 -2.99510896e-01 -4.76643682e-01 -2.13482916e-01\n",
      " -2.85364002e-01 -1.00109167e-01  2.61593550e-01  2.25215852e-01\n",
      "  6.27172232e-01 -2.02665865e-01 -9.44753587e-02  3.84867634e-03\n",
      "  1.41911700e-01 -2.53532797e-01 -3.73816669e-01  7.72304893e-01\n",
      "  4.58500326e-01  6.66627347e-01  3.00622255e-01  1.63684040e-01\n",
      " -1.13392666e-01 -2.09497944e-01 -4.20768559e-01 -4.73287374e-01\n",
      "  9.08184126e-02  5.52764893e-01 -7.97522545e-01 -2.95258254e-01\n",
      "  1.45228818e-01 -1.05786657e+00 -7.90705383e-01  6.15058124e-01\n",
      " -8.50686252e-01  3.43023658e-01 -8.67088079e-01  3.33772123e-01\n",
      "  2.93910414e-01  7.16952562e-01  6.84345067e-01  4.80720729e-01\n",
      " -6.38429046e-01  4.63476740e-02  4.40136373e-01 -7.91157901e-01\n",
      " -8.33920017e-02 -2.85905540e-01  1.75090000e-01 -7.75979280e-01\n",
      "  5.69454968e-01  1.88780844e-01 -4.53121543e-01 -2.43385315e-01\n",
      "  5.07758141e-01  5.05334795e-01 -5.78127384e-01 -2.29745969e-01\n",
      "  3.10508311e-01 -4.78058726e-01 -6.37070974e-03 -4.90819603e-01]\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "tensor_data = torch.normal(0, 0.5, size=(1, 1000))\n",
    "data_x = np.linspace(-1, 1, 1000)\n",
    "data_y = tensor_data.numpy().astype(\"float32\")\n",
    "print(tensor_data)\n",
    "print(data_y[0])\n",
    "plt.plot(data_x, data_y[0])\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 14.torch.eq(input, other)\n",
    "**比较元素是否相等**\n",
    "# 14.1.torch.equal(tensor1, tensor2, out=None)\n",
    "**比较两个张量是否相等，包含元素和形状**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 197,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "tensor([[ True, False],\n",
      "        [False,  True],\n",
      "        [False, False]])\n",
      "False\n"
     ]
    }
   ],
   "source": [
    "x = torch.Tensor([[1,2],[3,4],[5,5]])\n",
    "y = torch.Tensor([[1,3],[2,4],[4,3]])\n",
    "print(torch.eq(x, y))\n",
    "print(torch.equal(x, y))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 1.torch.mean(input, dim keepdim=False)\n",
    "**当keepdim=True时，输入的维度若为2，求完mean之后维度仍然是2**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 205,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "tensor([[1., 2., 3.],\n",
      "        [4., 5., 6.]], dtype=torch.float64)\n"
     ]
    }
   ],
   "source": [
    "A = np.arange(1, 7, dtype=float)\n",
    "\n",
    "a = torch.from_numpy(A).view(2,3)\n",
    "print(a)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 215,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "torch.mean(a): tensor(3.5000, dtype=torch.float64)\n",
      "====================万能的分隔符====================\n",
      "torch.mean(a,0): tensor([2.5000, 3.5000, 4.5000], dtype=torch.float64)\n",
      "torch.Size([3])\n",
      "====================万能的分隔符====================\n",
      "torch.mean(a,1) tensor([2., 5.], dtype=torch.float64)\n"
     ]
    }
   ],
   "source": [
    "print(\"torch.mean(a):\",torch.mean(a))\n",
    "print(20*\"=\" + \"万能的分隔符\"+ 20*\"=\")\n",
    "\n",
    "print(\"torch.mean(a,0):\",torch.mean(a,0))\n",
    "print(torch.mean(a,0).shape)\n",
    "print(20*\"=\" + \"万能的分隔符\"+ 20*\"=\")\n",
    "\n",
    "print(\"torch.mean(a,1)\",torch.mean(a,1))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### keepdim=True时，输出的维度等于原张量的维度"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 213,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "torch.mean(a,0, True):\n",
      " tensor([[2.5000, 3.5000, 4.5000]], dtype=torch.float64)\n",
      "torch.Size([1, 3])\n"
     ]
    }
   ],
   "source": [
    "b = torch.mean(a, 0, True)\n",
    "print(\"torch.mean(a,0, True):\\n\",b)\n",
    "print(b.shape)"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.4"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
